package com.bfly.mall.order.service;

import com.alibaba.fastjson.JSONObject;
import com.bfly.core.base.service.IBaseService;
import com.bfly.core.enums.AccessRole;
import com.bfly.mall.admin.entity.Admin;
import com.bfly.mall.order.dto.BookingOrderDTO;
import com.bfly.mall.order.dto.OrderStatusDTO;
import com.bfly.mall.order.entity.Order;
import com.bfly.mall.order.enums.ExpressStatusEnum;
import com.bfly.mall.order.enums.OrderOpTypeEnum;
import com.bfly.mall.order.enums.OrderStatusEnum;
import com.bfly.mall.order.enums.PayStatusEnum;
import com.bfly.mall.user.entity.User;

import java.math.BigDecimal;
import java.util.Date;

/**
 * @author 长沙商脉科技有限公司
 * @date 2020/10/4 18:27
 */
public interface IOrderService extends IBaseService<Order, Integer> {

    /**
     * 订单详情
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/19 9:52
     */
    Order getOrder(String orderNo);

    /**
     * 订单详情
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/12/11 11:30
     */
    Order getOrder(String orderNo, int userId);

    /**
     * 下订单--返回商户订单号
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/19 11:19
     */
    String bookingOrder(User user, BookingOrderDTO orderDTO);

    /**
     * 发起订单支付--返回支付参数给前端调用支付组件
     *
     * @param orderNo 订单号
     * @author 长沙商脉科技有限公司
     * @date 2020/12/12 10:26
     */
    JSONObject toPayOrder(User user, String orderNo);

    /**
     * 计算订单价格
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/11/17 13:18
     */
    BigDecimal calculateOrderFreight(int userId, BookingOrderDTO orderDTO);

    /**
     * 计算订单优惠卷折扣
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/11/18 16:02
     */
    BigDecimal calculateOrderDiscount(int userId, BookingOrderDTO bookingOrder);

    /**
     * 取消订单
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 13:19
     */
    void cancelOrder(String orderNo, String reason, int opId, String opName, AccessRole role);

    /**
     * 订单确认收货
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/12/4 18:05
     */
    void confirmReceiveOrder(String orderNo, String remark, int opId, String opName, AccessRole role);

    /**
     * 订单支付成功
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/5/11 17:51
     */
    void paySuccessOrder(String orderNo, String transactionId, Date payTime, int opId, String opName, OrderOpTypeEnum typeEnum, AccessRole role);

    /**
     * 商户确认收货----针对退货退款情况
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 19:54
     */
    void shopKeeperConfirmReceiveForRefund(Admin admin, String orderNo);

    /**
     * 修改订单状态
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 13:21
     */
    void editOrderStatus(String orderNo, OrderStatusEnum status);

    /**
     * 修改订单支付状态
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 13:22
     */
    void editPayStatus(String orderNo, PayStatusEnum status);

    /**
     * 修改订单物流状态
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 13:22
     */
    void editExpressStatus(String orderNo, ExpressStatusEnum status);

    /**
     * 回写订单微信预支付ID
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/5/17 20:10
     */
    void editOrderPrepayId(String orderNo, String prepayId);

    /**
     * 获得订单的状态相关信息
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/10/8 20:12
     */
    OrderStatusDTO getStatuses(String orderNo);
}
